package ar.com.hakasoft


import ar.com.hakasoft.entities.Articulo
import ar.com.hakasoft.entities.Factura
import ar.com.hakasoft.utils.DateUtil

class ReportesController extends LoginController {

	def reportesService
	def facturasService
	def egresosService
	
	def beforeInterceptor = [action:this.&checkUser,except:[]]
	
    def index = { 
		def anioActual = new Date().year + 1900
		def anioComienzo = 2011 //hardcode desde cuadno comenzo el sistema
		def listAnios = []
		
		for (int i = anioComienzo; i <  anioActual  +1 ; i++){
			listAnios.add(i)
		}
		def mesActual = Calendar.instance.get(Calendar.MONTH).toLong() + 1
		[listAnios: listAnios, anioActual:anioActual, mesActual:mesActual]
	}
	
	def generarReporte = {
		log.warn "generarReporte: ${params}"
		
		def ingresosList
		def egresosList
		def vendedorSeleccionado
		def anioSeleccionado = params.anioReporte
		def mesSeleccionado = params.mesReporte
		def fecha
		boolean imprimir = false
		
		if (params?.get("vendedor.id")!=null && !params?.get("vendedor.id").equals("null")){
			vendedorSeleccionado = params?.get("vendedor.id").toLong()
		}
		if (anioSeleccionado && anioSeleccionado.isInteger()){
			anioSeleccionado = anioSeleccionado.toInteger()
		}
		if (mesSeleccionado && mesSeleccionado.isInteger()){
			mesSeleccionado = mesSeleccionado.toInteger()
			mesSeleccionado -= 1
		}
		if (params.inputDate){
			fecha = params.inputDate.replace("/", " ")
		}
		if (params.imprimir){
			imprimir = params.imprimir.toBoolean()
		}
		
		if(params.tipoBusqueda.equals("todos")){
			ingresosList = reporteIngresos(vendedorSeleccionado, anioSeleccionado, mesSeleccionado, fecha, imprimir)
			egresosList = reporteEgresos(anioSeleccionado, mesSeleccionado, fecha, imprimir)
		}else if (params.tipoBusqueda.equals("ingresos")){
			ingresosList = reporteIngresos(vendedorSeleccionado, anioSeleccionado, mesSeleccionado, fecha, imprimir)
		}else if (params.tipoBusqueda.equals("egresos")){
			log.warn "$anioSeleccionado, $mesSeleccionado, $fecha"
			egresosList = reporteEgresos(anioSeleccionado, mesSeleccionado, fecha, imprimir)
		}
		
		session.setAttribute("reporteParams", params)
		def mapaTotales
		
		def destino = "/templates/reporteTable"
		if (imprimir){
			mapaTotales = getTotalesImprimir(ingresosList,egresosList)
			destino = "/templates/imprimirReporte"
		}else{
			mapaTotales = [egresosList:egresosList, ingresosList:ingresosList]
		}
		render(template: destino, model: [mapaTotales:mapaTotales])
	}
	
	def getTotalesImprimir(ingresosList, egresosList){
		println params
		def cal = params.inputDate != null ? DateUtil.convertToCal(params.inputDate.replace("/", " ")) : null 
		def ingresosFiltered = ingresosList?.findAll{it.fueCobrada && params.inputDate != null ? DateUtil.isSameDayOf(it.fechaPagada, cal) : true}?.precioTotal?.sum()
		def mapaTotales = ["TotalIngreso":ingresosFiltered, "TotalEgreso":egresosList?.total?.sum()]
		def listaIngresos = []
		def mapaFechaEgresos  = [:]
		
		Articulo.list().each {
			mapaTotales["${it.descripcion}"] = 0
			mapaTotales["${it.descripcion}FueCobrada"] = 0
		}
		ingresosList.sort{it.id}.each { factura ->
			def mapReporteIngreso = [:]
			def persona = factura.vendedor?:factura.dietetica?:factura.cliente
			mapReporteIngreso["persona"] = "${persona}"
			mapReporteIngreso["factura"] = factura
			mapReporteIngreso["fueCobrada"] = factura.fueCobrada
			if (DateUtil.isSameDayOf(factura.fechaPagada, cal) || params.inputDate == null){
				mapReporteIngreso["subTotal"] = factura.precioCalculado
			}else{
				mapReporteIngreso["subTotal"] = 0
			}
			mapReporteIngreso["PoteSubTotal"] = 0
			factura.itemFactura.each { item ->
				def descripcion = item.articulo.descripcion
				if (DateUtil.isSameDayOf(factura.fecha, cal) || params.inputDate == null){
					mapaTotales["$descripcion"] += item.cantidad
				}
				if(item.factura.fueCobrada){
					mapaTotales["${descripcion}FueCobrada"] += item.cantidad
				}
				if (descripcion == "Pote" && (DateUtil.isSameDayOf(factura.fecha, cal) || params.inputDate == null)){// && item.factura.fueCobrada){
					mapReporteIngreso["PoteSubTotal"] += item.cantidad
				}
			}
			listaIngresos.add(mapReporteIngreso)
		}
		
		if (!params.inputDate){
			egresosList.each { factura->
				mapaFechaEgresos[DateUtil.toString(factura.fecha)] = 0
			}
			egresosList.each { egreso ->
				def fecha = DateUtil.toString(egreso.fecha)
				if (!mapaFechaEgresos["$fecha"]){
					mapaFechaEgresos["$fecha"] = 0
				}
				mapaFechaEgresos["$fecha"] += egreso.total
			}
		}else{
			mapaFechaEgresos = egresosList
		}
		mapaTotales += [ingresosList:listaIngresos, egresosList: mapaFechaEgresos]
		return mapaTotales
	}
	
	def reporteIngresos(vendedorSeleccionado, anioSeleccionado, mesSeleccionado, fecha, imprimir){
		
//		def facturasList = getReporteFacturacionMesActual(vendedorSeleccionado, anioSeleccionado, mesSeleccionado, fecha, imprimir)
		def facturasList = reportesService.getReporteFacturacionMesActual(vendedorSeleccionado, anioSeleccionado, mesSeleccionado, fecha, imprimir)

		if (imprimir){
			return facturasList
		}
		def listDeAnios
		
		if (facturasList){
			listDeAnios = new NodoAnio()
			facturasList.eachWithIndex { factura, i ->
				listDeAnios.add(factura)
			}
		}
		
		listDeAnios
	}
	
	def reporteEgresos(anioSeleccionado, mesSeleccionado, fecha, imprimir){
		def egresosList = reportesService.getReporteEgreso(anioSeleccionado, mesSeleccionado, fecha)
		if (imprimir){
			return egresosList
		}
		
		def egresos
		
		if (egresosList){
			egresos = new EgresoAnio()
			egresosList.eachWithIndex { factura, i ->
				egresos.add(factura)
			}
		}
		
		egresos
	}
	
	def eliminarFactura = {
		def reporteParams = session.getAttribute("reporteParams")
		reporteParams.vendedor = reporteParams.get("vendedor.id")
		facturasService.eliminarFactura(params.id)
		redirect(action: "generarReporte", params: reporteParams)
	}
	
	def eliminarEgreso = {
		def reporteParams = session.getAttribute("reporteParams")
		reporteParams.vendedor = reporteParams.get("vendedor.id")
		egresosService.eliminarEgreso(params.id)
		redirect(action: "generarReporte", params: reporteParams)
	}
	
}